zero trust architecture blueprint/zero-trust-architecture-offline-v2/run.ps1 (189 lines of code) (raw):

param( [Parameter(Mandatory = $false, HelpMessage = 'namePrefix')] [string] $namePrefix ) $jConfig = Get-Content "./run.config.json" | ConvertFrom-Json $tempPath = $jConfig.args.tempPath $policyTemplate = $jConfig.args.policyTemplate $artifactsPath = $jConfig.args.artifactsPath $policyAssignmentPrefix = $jConfig.args.policyAssignmentPrefix $onlyGenerateTemplates = $jConfig.args.onlyGenerateTemplates $deploymentUserObjectIdParameterName = "deployment-user-object-id" $resourceLocation = $jConfig.parameters.location.value $resourceLocation = if ($null -eq $resourceLocation -or "" -eq $resourceLocation) { $jConfig.parameters.workspaceLocation.value } else { $resourceLocation } $jDefaultParams = Get-Content $jConfig.args.defaultParams | ConvertFrom-Json function Add-DefaultParamsToTemplate { param ( $jTemplate, $jParameterProperties ) foreach ($paramNames in $jParameterProperties.psobject.properties.value) { $defaultParams = Get-DefaultParameterValues -paramName $null -paramNames $paramNames foreach ($defaultParam in $defaultParams.keys) { if ($null -ne $defaultParams[$defaultParam] -and $jTemplate.parameters.psobject.properties.name -notcontains $defaultParam) { $jTemplate.parameters | add-member -Name $defaultParam -value $defaultParams[$defaultParam] -MemberType NoteProperty } } } } function Get-DefaultParameterValues { param ( $paramName, $paramNames ) $defaultParams = @{ } $pattern = 'parameters\(''(?<name>[^\s]*)''\)' foreach ($g in Select-String -InputObject $paramNames -Pattern $pattern -AllMatches | % { $_.matches.groups }) { if ($g.Name -eq "name" -and $jDefaultParams.properties.parameters.psobject.properties.name -contains $g.value) { if ($null -eq $paramName) { $defaultParams[$g.value] = $jDefaultParams.properties.parameters.$($g.value) } else { $defaultParams[$paramName] = $jDefaultParams.properties.parameters.$($g.value) } } } return $defaultParams } function Get-TemplateParameters { param ( $jParameters ) $templateParameters = @{ } foreach ($paramName in $jParameters.psobject.properties.name) { foreach ($name in $jConfig.parameters.psobject.properties.name) { if ($name -eq $paramName -and $null -ne $jConfig.parameters.$($name)) { if ($name -eq "location") { $templateParameters[$paramName] = $resourceLocation } else { $templateParameters[$paramName] = $jConfig.parameters.$($name) } } } } if ($null -ne $templateParameters.$deploymentUserObjectIdParameterName) { if ($null -eq $templateParameters.$deploymentUserObjectIdParameterName.value -or "" -eq $templateParameters.$deploymentUserObjectIdParameterName.value) { if ($onlyGenerateTemplates -eq $false) { $userObjectId = (Get-AzADUser -UserPrincipalName (Get-AzContext).Account.Id).Id $templateParameters[$deploymentUserObjectIdParameterName] = @{ "value" = $userObjectId } } } } return $templateParameters } function New-PolicyAssignment { param ( $artifact ) $jArtifact = Get-Content $artifact | ConvertFrom-Json if ($jArtifact.kind -ne "policyAssignment") { Write-Host "Artifact '$($artifact)' is not a valid policyAssignment. Skipping..." return } $jPolicyTemplate = Get-Content $policyTemplate | ConvertFrom-Json $jPolicyTemplate.resources.properties | add-member -Name "parameters" -Value $jArtifact.properties.parameters -MemberType NoteProperty Add-DefaultParamsToTemplate -jTemplate $jPolicyTemplate -jParameterProperties $jPolicyTemplate.resources.properties.parameters Add-DefaultParamsToTemplate -jTemplate $jPolicyTemplate -jParameterProperties $jPolicyTemplate.parameters $templateParameters = Get-TemplateParameters -jParameters $jPolicyTemplate.parameters $templateParameters.policyAssignmentName = @{ } $policyAssignmentName = "$($policyAssignmentPrefix)$($jArtifact.properties.displayName)" if ($policyAssignmentName.Length -lt 65) { $templateParameters.policyAssignmentName.value = $policyAssignmentName.Trim() } else { $templateParameters.policyAssignmentName.value = $policyAssignmentName.Substring(0, 64).Trim() } $templateParameters.policyDefinitionID = @{ } $templateParameters.policyDefinitionID.value = $jArtifact.properties.policyDefinitionId $templateParameters.location.value = $resourceLocation $policyTemplateFile = "$($tempPath)/policy.$($jArtifact.name).json" $jPolicyTemplate | ConvertTo-Json -Depth 100 | Set-Content $policyTemplateFile $policyTemplateParameterFile = "$($tempPath)/policy.$($jArtifact.name).parameters.json" $templateParameters | ConvertTo-Json -Depth 100 | Set-Content $policyTemplateParameterFile if ($onlyGenerateTemplates -eq $false) { New-AzDeployment -Location $resourceLocation -TemplateFile $policyTemplateFile -TemplateParameterFile $policyTemplateParameterFile } } function New-ResourceDeployment { param ( $artifact ) $jArtifact = Get-Content $artifact | ConvertFrom-Json if ($null -ne $jArtifact.properties.template) { $jResourceTemplate = $jArtifact.properties.template } else { $jResourceTemplate = $jArtifact } foreach ($param in $jArtifact.properties.parameters.psobject.properties) { $defaultParamValues = Get-DefaultParameterValues -paramName $param.name -paramNames $param.value -jDefaultParams $jDefaultParams $jResourceTemplate.parameters.$($param.name) = $defaultParamValues[$param.name] } $tempFileName = if ($null -eq $jArtifact.name) { (Split-Path -Path $artifact -Leaf).Split(".")[0] } else { $jArtifact.name } $resourceTemplateFile = "$($tempPath)/resource.$($tempFileName).json" $jResourceTemplate | ConvertTo-Json -Depth 100 | Set-Content $resourceTemplateFile -Force $resourceTemplateParameterFile = "$($tempPath)/resource.$($tempFileName).parameters.json" Get-TemplateParameters -jParameters $jResourceTemplate.parameters -jConfig $jConfig | ConvertTo-Json -Depth 100 | Set-Content $resourceTemplateParameterFile -Force if ($onlyGenerateTemplates -eq $false) { if ($jResourceTemplate.'$schema'.EndsWith("subscriptionDeploymentTemplate.json#")) { New-AzDeployment -Location $resourceLocation -TemplateFile $resourceTemplateFile -TemplateParameterFile $resourceTemplateParameterFile } else { $namePrefix = "" $name = "" if ($null -ne $jConfig.parameters.namePrefix.value -and "" -ne $jConfig.parameters.namePrefix.value) { $namePrefix = $jConfig.parameters.namePrefix.value } else { $namePrefix = $jResourceTemplate.parameters.namePrefix.defaultValue } if ($null -ne $jResourceTemplate.parameters.spokeName -and $null -ne $jConfig.parameters.spokeName.value -and "" -ne $jConfig.parameters.spokeName.value) { $name = $jConfig.parameters.spokeName.value } elseif ($null -ne $jResourceTemplate.parameters.spokeName.defaultValue -and "" -ne $jResourceTemplate.parameters.spokeName.defaultValue) { $name = $jResourceTemplate.parameters.spokeName.defaultValue } elseif ($null -ne $jConfig.parameters.hubName.value -and "" -ne $jConfig.parameters.hubName.value) { $name = $jConfig.parameters.hubName.value } else { $name = $jResourceTemplate.parameters.hubName.defaultValue } $resourceGroupName = "$($namePrefix)-$($name)-rg" New-AzResourceGroup -Name $resourceGroupName -Location $resourceLocation -Force New-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -TemplateFile $resourceTemplateFile -TemplateParameterFile $resourceTemplateParameterFile } } } # MAIN $ErrorActionPreference = "Stop" Set-Item Env:\SuppressAzurePowerShellBreakingChangeWarnings "true" New-Item -ItemType Directory -Force -Path $tempPath if ($null -ne $namePrefix -and "" -ne $namePrefix) { $jConfig.parameters.namePrefix.value = $namePrefix } foreach ($policy in $jConfig.policies) { if ($policy.enabled -eq $true) { Write-Host "===== Start: Assigning policy '$($policyAssignmentPrefix)$($policy.name)'... =====" New-PolicyAssignment -artifact "$($artifactsPath)/$($policy.artifact)" Write-Host "===== End: Assigning policy '$($policyAssignmentPrefix)$($policy.name)'... =====" } } foreach ($resource in $jConfig.resources) { if ($resource.enabled -eq $true) { if ($resource.artifact.EndsWith(".json")) { Write-Host "===== Start: Deploying resource '$($resource.artifact)' =====" New-ResourceDeployment -artifact "$($artifactsPath)/$($resource.artifact)" Write-Host "===== End: Deploying resource '$($resource.artifact)' =====" } elseif ($resource.artifact.EndsWith(".ps1")) { Write-Host "===== Start: Executing script '$($resource.artifact)' =====" & "$($artifactsPath)/$($resource.artifact)" -namePrefix $jConfig.parameters.namePrefix.value -hubName $($jConfig.parameters.hubName.value) -location $resourceLocation Write-Host "===== End: Executing script '$($resource.artifact)' =====" } else { Write-Host "===== Error: Invalid artifact type '$($resource.artifact)' =====" } } }